package com.seeyon.apps.sphr.kit;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.sphr.enums.*;
import com.seeyon.cap4.form.bean.*;
import com.seeyon.cap4.form.modules.engin.base.formData.CAP4FormDataManager;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.cap4.template.manager.CAPDataListSqlHelpManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.ModuleType;
import com.seeyon.ctp.common.authenticate.domain.User;
import com.seeyon.ctp.common.content.mainbody.CtpContentAllBean;
import com.seeyon.ctp.common.content.mainbody.MainbodyService;
import com.seeyon.ctp.common.content.mainbody.MainbodyStatus;
import com.seeyon.ctp.common.content.mainbody.MainbodyType;
import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.filemanager.dao.AttachmentDAO;
import com.seeyon.ctp.common.filemanager.manager.FileManager;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.common.po.content.CtpContentAll;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem;
import com.seeyon.ctp.common.po.filemanager.Attachment;
import com.seeyon.ctp.common.po.filemanager.V3XFile;
import com.seeyon.ctp.organization.bo.V3xOrgDepartment;
import com.seeyon.ctp.organization.manager.OrgManager;
import com.seeyon.ctp.util.DateUtil;
import com.seeyon.ctp.util.UUIDLong;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class FormKit {

    private static final Log log = CtpLogFactory.getLog(FormKit.class);

    private static final String grpj_unFlowformCode = AppContext.getSystemProperty("oaFormCode.grpj_unFlowformCode");
    private static final String dsy_itemEnumCode = AppContext.getSystemProperty("oa.dsy_itemEnumCode");
    private static final String sphr_itemEnumCode = AppContext.getSystemProperty("oa.sphr_itemEnumCode");
    private static final String spyw_itemEnumCode = AppContext.getSystemProperty("oa.spyw_itemEnumCode");

    private static EnumManager enumManager = (EnumManager) AppContext.getBean("enumManagerNew");
    private static FileManager fileManager = (FileManager) AppContext.getBean("fileManager");
    private static AttachmentDAO attachmentDAO = (AttachmentDAO) AppContext.getBean("attachmentDAO");
    private static CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private static CAP4FormDataManager cap4FormDataManager = (CAP4FormDataManager) AppContext.getBean("cap4FormDataManager");
    private static CAPDataListSqlHelpManager capDataListSqlHelpManager = (CAPDataListSqlHelpManager) AppContext.getBean("capDataListSqlHelpManager");
    private static OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");

    /**
     * 添加附件信息
     * <p>
     * * @param invoiceType 票据类型
     *
     * @param fileId        文件ID，用于从文件管理中获取文件信息
     * @param dataId        数据ID，表示附件所属的数据项
     * @param sub_reference 子引用ID，用于进一步细化附件的归属或分类
     */
    public static void addAttachment(Long fileId, Long dataId, Long sub_reference) {
        try {
            // 从文件管理中获取V3X文件对象
            V3XFile v3xFile = fileManager.getV3XFile(fileId);

            // 创建一个新的Attachment对象
            Attachment attachment = new Attachment();
            // 如果是新的附件，则设置其ID
            attachment.setIdIfNew();
            // 设置附件的类别为66，这里的66可能是预定义的附件类别代码
            attachment.setCategory(66);
            // 设置附件的创建日期
            attachment.setCreatedate(v3xFile.getCreateDate());
            // 设置附件的描述信息
            attachment.setDescription(v3xFile.getDescription());
            // 设置附件的文件名
            attachment.setFilename(v3xFile.getFilename());
            // 设置附件的文件URL，这里使用文件ID作为URL
            attachment.setFileUrl(v3xFile.getId());
            // 设置附件的引用ID，表示附件所属的数据项
            attachment.setReference(dataId);
            // 设置附件的子引用ID，用于进一步细化附件的归属或分类
            attachment.setSubReference(sub_reference);
            // 设置附件的类型
            attachment.setType(v3xFile.getType());
            // 设置附件的MIME类型
            attachment.setMimeType(v3xFile.getMimeType());
            // 设置附件的大小
            attachment.setSize(v3xFile.getSize());
            // 设置附件的排序字段，默认为1
            attachment.setSort(1);

            // 保存附件信息到数据库
            attachmentDAO.save(attachment);
        } catch (Exception e) {
            // 记录添加附件信息失败的日志
            log.error("添加附件信息失败:", e);
        }
    }

    /**
     * 添加表单数据
     * <p>
     * 此方法用于创建并返回一个FormDataMasterBean对象它根据提供的发票类型、数据、子引用、XCD子引用和用户信息来填充这个对象
     *
     * @param invoiceType       发票类型，用于指定表单数据的类型
     * @param data              OCR识别后返回json数据，以字符串形式提供
     * @param sub_reference     发票附件ID
     * @param xcd_sub_reference 行程单附件ID
     * @param user              用户对象，表示操作或关联此表单数据的用户
     * @return 返回一个填充了所提供数据的FormDataMasterBean对象
     */
    public static FormDataMasterBean addFormDataMasterBean(String reimbursementType, String projectName, String projectCode, String invoiceType, String data, Long sub_reference, Long xcd_sub_reference, User user) {
        try {
            // 解析传入的数据，转换为JSONObject对象
            JSONObject jsonObject = JSONObject.parseObject(data);
            // 初始化words_result为null，用于后续存储解析结果
            JSONArray words_result = null;
            // 检查jsonObject中是否包含关键字段"words_result"
            if (jsonObject.containsKey("words_result")) {
                // 如果包含，则获取其对应的JSONArray对象
                words_result = jsonObject.getJSONArray("words_result");
            } else {
                // 如果不包含，则记录日志并抛出异常，提示识别解析失败
                log.info("发票OCR识别解析失败:" + data);
                throw new BusinessException("发票识别解析失败,请联系管理员查看!");
            }
            // 获取第一项解析结果的"type"字段值，用于后续判断发票类型
            String type = StrKit.str(words_result.getJSONObject(0).get("type"));

            // 根据枚举代码获取对应的枚举项
            CtpEnumItem ctpEnumItem = enumManager.getItemByCode(dsy_itemEnumCode);
            // 如果未找到对应的枚举项，则抛出异常，提示枚举编码有误
            if (ctpEnumItem == null) {
                throw new BusinessException("[使用状态]枚举中枚举项[待使用]的枚举编码[DSY]有误,请核对!");
            }
            // 根据表单代码获取对应的表单Bean对象
            FormBean formBean = cap4FormManager.getFormByFormCode(grpj_unFlowformCode);
            // 获取表单中"发票号"字段的名称
            String fph_fieldName = formBean.getFieldBeanByDisplay("发票号").getName();
            // 初始化发票号的描述为空字符串，用于后续根据发票类型确定其值
            String fph_fieldDesc = "";
            // 根据不同的发票类型，设置发票号的描述
            if ("vat_invoice".equals(type) || "ferry_ticket".equals(type) || "toll_invoice".equals(type) || "bus_ticket".equals(type) || "printed_invoice".equals(type) || "taxi_receipt".equals(type) || "roll_normal_invoice".equals(type)) {
                fph_fieldDesc = "InvoiceNum";
            } else if ("train_ticket".equals(type)) {
                fph_fieldDesc = "ticket_num";
            } else if ("quota_invoice".equals(type)) {
                fph_fieldDesc = "invoice_number";
            } else if ("air_ticket".equals(type)) {
                fph_fieldDesc = "ticket_number";
            }
            // 调用方法解析发票，获取发票号
            String invoiceNum = analysisInvoice(words_result, fph_fieldDesc);
            // 获取表单中"票据状态"字段的名称
            String pjzt_fieldName = formBean.getFieldBeanByDisplay("票据状态").getName();
            // 获取表单主表的表名
            String tableName = formBean.getMasterTableBean().getTableName();

            // 初始化StringBuffer对象，用于构建SQL查询语句
            StringBuffer stb = new StringBuffer();
            // 构建SQL查询语句，查询符合条件的记录
            stb.append("SELECT id FROM ").append(tableName).append(" WHERE ").append(fph_fieldName);
            stb.append(" = '").append(invoiceNum).append("' AND ").append(pjzt_fieldName);
            stb.append(" ='").append(ctpEnumItem.getId()).append("'");
            // 执行SQL查询，获取查询结果
            List list = capDataListSqlHelpManager.selectDataList(stb.toString(), null);
            // 初始化dataId为空字符串，用于存储查询结果中的id值
            String dataId = "";
            // 检查查询结果是否为空
            if (!list.isEmpty()) {
                // 如果不为空，则获取第一条记录，并提取id值
                Map<String, Object> dataMap = (Map<String, Object>) list.get(0);
                dataId = StrKit.str(dataMap.get("id"));
            }
            // 根据dataId的值，决定是获取已存在的表单数据还是创建新的表单数据
            FormDataMasterBean formDataMasterBean = null;
            if (!"".equals(dataId)) {
                // 如果dataId非空，则根据id获取已存在的表单数据
                formDataMasterBean = cap4FormManager.getDataMasterBeanById(Long.parseLong(dataId), formBean, null);
            } else {
                // 如果dataId为空，则创建新的表单数据
                formDataMasterBean = FormDataMasterBean.newInstance(formBean);
            }
            // 根据发票类型处理并解析发票信息
            if ("vat_invoice".equals(type) || "roll_normal_invoice".equals(type) || "printed_invoice".equals(type)) {
                // 遍历增值税发票枚举
                for (VatInvoiceEnum vatInvoiceEnum : VatInvoiceEnum.values()) {
                    String key = vatInvoiceEnum.getKey();
                    String value = vatInvoiceEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);

                    // 对卷式普通发票和打印发票的特定字段进行处理
                    if ("roll_normal_invoice".equals(type) || "printed_invoice".equals(type)) {
                        if ("TotalAmount".equals(key)) {
                            continue;
                        }
                    }

                    // 对发票日期进行格式化处理
                    if ("InvoiceDate".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else {
                        // 对卷式普通发票和打印发票的含税金额字段进行特殊处理
                        if ("roll_normal_invoice".equals(type) || "printed_invoice".equals(type)) {
                            if ("TotalTax".equals(key)) {
                                formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("含税发票金额").getName(), fieldValue);
                            } else {
                                formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                            }
                        } else {
                            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                        }
                    }
                }
            } else if ("taxi_receipt".equals(type)) {
                // 遍历出租车发票枚举
                for (TaxiReceiptEnum taxiReceiptEnum : TaxiReceiptEnum.values()) {
                    String key = taxiReceiptEnum.getKey();
                    String value = taxiReceiptEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);

                    // 对日期字段进行格式化处理
                    if ("Date".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else {
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                    }
                }
            } else if ("train_ticket".equals(type)) {
                // 遍历火车票枚举
                for (TrainTicketEnum trainTicketEnum : TrainTicketEnum.values()) {
                    String key = trainTicketEnum.getKey();
                    String value = trainTicketEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);

                    // 对日期字段进行格式化处理
                    if ("date".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else if ("ticket_rates".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("￥", "").replaceAll("元", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else {
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                    }
                }
            } else if ("quota_invoice".equals(type)) {
                // 遍历QuotaInvoiceEnum枚举类型，处理定额发票
                for (QuotaInvoiceEnum quotaInvoiceEnum : QuotaInvoiceEnum.values()) {
                    String key = quotaInvoiceEnum.getKey();
                    String value = quotaInvoiceEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);
                    formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                }
            } else if ("air_ticket".equals(type)) {
                // 处理飞机票，则遍历AirTicketEnum枚举类型进行处理
                for (AirTicketEnum airTicketEnum : AirTicketEnum.values()) {
                    String key = airTicketEnum.getKey();
                    String value = airTicketEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);
                    // 对日期相关的字段进行格式转换，移除中文年月日标识
                    if ("date".equals(key) || "start_date".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else {
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                    }
                }
            } else if ("bus_ticket".equals(type) || "ferry_ticket".equals(type)) {
                // 处理汽车票和轮渡票，两者部分逻辑相似，但有细微差别

                // 轮渡票特有的日期格式处理
                if ("ferry_ticket".equals(type)) {
                    String TicketDate = analysisInvoice(words_result, "TicketDate");
                    String fieldValue_new = TicketDate.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                    formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("开票日期").getName(), fieldValue_new);
                }
                for (BusTicketEnum busTicketEnum : BusTicketEnum.values()) {
                    String key = busTicketEnum.getKey();
                    String value = busTicketEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);
                    // 轮渡票中特定字段的特殊处理逻辑
                    if ("ferry_ticket".equals(type)) {
                        if ("InvoiceTime".equals(key)) {
                            continue;
                        }
                    }
                    // 对日期相关的字段进行格式转换，移除中文年月日标识
                    if ("date".equals(key) || "InvoiceTime".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else {
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                    }
                }
            } else if ("toll_invoice".equals(type)) {
                // 处理通行费发票，对特定日期字段进行格式转换
                for (TollInvoiceEnum tollInvoiceEnum : TollInvoiceEnum.values()) {
                    String key = tollInvoiceEnum.getKey();
                    String value = tollInvoiceEnum.getValue();
                    String fieldValue = analysisInvoice(words_result, key);
                    if ("OutDate".equals(key)) {
                        String fieldValue_new = fieldValue.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "");
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue_new);
                    } else {
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay(value).getName(), fieldValue);
                    }
                }
            }
            // 添加或更新表单数据，主要处理票据信息和用户关联数据
            if (!"".equals(reimbursementType)) {
                String bxlxEnumId = StrKit.str(enumManager.getItemByCode(reimbursementType).getId());
                formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("报销类型").getName(), bxlxEnumId);
            }
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("项目名称").getName(), projectName);
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("项目编码").getName(), projectCode);
            // 将票据类型字段名和发票类型值添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("票据类型").getName(), invoiceType);
            // 将登记人字段名和当前用户ID添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("登记人").getName(), user.getId());
            // 将使用人字段名和当前用户ID添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("使用人").getName(), user.getId());
            // 将登记部门字段名和当前用户部门ID添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("登记部门").getName(), user.getDepartmentId());
            // 将使用部门字段名和当前用户部门ID添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("使用部门").getName(), user.getDepartmentId());
            // 将登记日期字段名和当前日期添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("登记日期").getName(), new Date());

            // 获取当前用户所在部门的父部门信息
            V3xOrgDepartment parentDepartment = orgManager.getParentDepartment(user.getDepartmentId());
            // 获取父部门名称
            String deptName = parentDepartment.getName();
            // 初始化登记单位的枚举项代码
            String dwmc_enumItemCode = "";

            // 根据父部门名称确定登记单位的枚举项代码
            if ("盛普有为".equals(deptName)) {
                dwmc_enumItemCode = spyw_itemEnumCode;
            } else if ("盛普和润".equals(deptName)) {
                dwmc_enumItemCode = sphr_itemEnumCode;
            }

            // 如果登记单位的枚举项代码非空，则获取对应的枚举项
            if (!"".equals(dwmc_enumItemCode)) {
                CtpEnumItem dwmc_enumItem = enumManager.getItemByCode(dwmc_enumItemCode);
                // 如果枚举项不存在，抛出异常
                if (dwmc_enumItem == null) {
                    throw new BusinessException("[登记单位]枚举(单位名称)中枚举项的枚举编码[" + dwmc_enumItemCode + "]有误,请核对!");
                }
                // 将登记单位字段名和对应的枚举项ID添加到表单数据主对象
                formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("登记单位").getName(), dwmc_enumItem.getId());
            }

            // 如果有发票原件的引用，则将它添加到表单数据主对象
            if (sub_reference != null) {
                formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("发票原件").getName(), sub_reference);
            }
            // 如果有行程单原件的引用，则将它添加到表单数据主对象
            if (xcd_sub_reference != null) {
                formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("行程单原件").getName(), xcd_sub_reference);
            }
            // 将票据状态字段名和票据状态的枚举项ID添加到表单数据主对象
            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("票据状态").getName(), ctpEnumItem.getId());

            // 调用工具类方法，添加不参与工作流的表单数据
            FormKit.addUnFlowFormDataCap4(formDataMasterBean, formBean);
            // 返回填充完毕的表单数据主对象
            return formDataMasterBean;
        } catch (Exception e) {
            // 记录添加或更新表单数据过程中发生的异常
            log.error("添加或更新个人票夹档案数据失败:", e);
        }
        // 如果发生异常，返回null
        return null;
    }

    /**
     * 添加无流程表单数据及附件信息。
     * 此方法用于处理无流程的表单数据的添加操作，包括表单主数据的插入或更新，
     * 以及表单正文内容的保存。如果当前用户存在，则使用当前用户ID，
     * 否则使用表单创建者ID作为操作人ID。
     *
     * @param formDataMasterBean 表单主数据对象，包含要插入或更新的表单主数据信息。
     * @param formBean           表单详细数据对象，包含表单的权限视图信息和正文内容等。
     */
    public static void addUnFlowFormDataCap4(FormDataMasterBean formDataMasterBean, FormBean formBean) {
        try {
            // 尝试获取当前操作用户
            User user = AppContext.getCurrentUser();
            // 初始化用户ID变量，并尝试从当前用户获取用户ID
            Long userId = null;
            if (user != null) {
                userId = user.getId();
            }
            // 如果当前用户ID为空，则使用表单创建者ID
            if (userId == null) {
                userId = formBean.getCreatorId();
            }
            // 获取表单的权限视图信息，用于后续的操作权限判断
            FormAuthViewBean formAuthViewBean = formBean.getNewFormAuthViewBeans().get(0);
            // 将权限视图ID转换为字符串格式
            String rightid = String.valueOf(formAuthViewBean.getId());

            // 先插入或更新表单主数据
            cap4FormDataManager.insertOrUpdateMasterData(formDataMasterBean);
            // 获取刚刚插入或更新的表单主数据的ID
            Long masterId = formDataMasterBean.getId();

            // 确定表单模块类型，用于后续的正文内容处理
            int moduleType = getModuleTypeCap4(formBean);
            // 获取主body服务实例，用于保存正文内容
            MainbodyService mainBodyService = MainbodyService.getInstance();
            // 根据模块类型和主数据ID获取表单的正文内容
            CtpContentAll ctpContentAll = mainBodyService.getContent(moduleType, masterId);
            // 对获取到的正文内容进行加工或更新，同时设置操作人ID和权限视图ID
            ctpContentAll = saveContentAllForFormCap4(ctpContentAll, masterId, userId, formBean, rightid);
            // 保存或更新加工后的正文内容
            mainBodyService.saveOrUpdateContentAll(ctpContentAll);
        } catch (Exception e) {
            // 捕获并记录操作中可能出现的异常
            log.error("新增无流程表单数据报错信息:", e);
        }
    }

    /**
     * 保存表单内容信息。
     * 该方法用于处理表单内容的保存逻辑，包括新内容的创建和已有内容的更新。
     *
     * @param ctpContentAll 当前的内容信息，如果为null，则表示需要创建新内容。
     * @param masterId      主数据ID，用于关联内容和主数据。
     * @param userid        修改人ID，用于记录内容的修改者。
     * @param formBean      表单bean，包含表单的绑定信息和模块类型。
     * @param rightId       权限ID，用于记录内容的权限信息。
     * @return 返回保存或更新后的表单内容信息。
     * @throws BusinessException 如果没有应用绑定，则抛出业务异常。
     */
    private static CtpContentAll saveContentAllForFormCap4(CtpContentAll ctpContentAll, long masterId, long userid, FormBean formBean, String rightId) throws BusinessException {
        // 获取当前时间戳，用于记录创建或修改时间。
        Timestamp timestamp = DateUtil.currentTimestamp();
        // 如果ctpContentAll不为空，则进行更新操作。
        if (ctpContentAll != null) {
            // 更新修改人ID和修改时间。
            ctpContentAll.setModifyId(userid);
            ctpContentAll.setModifyDate(timestamp);
            return ctpContentAll;
        }
        // 创建新内容。
        CtpContentAllBean content = new CtpContentAllBean();
        // 获取表单的绑定信息。
        FormBindBean bindBean = formBean.getBind();
        if (bindBean != null) {
            // 设置模块模板ID。
            content.setModuleTemplateId(bindBean.getId());
            // 获取绑定授权信息。
            Map<String, FormBindAuthBean> bindAuth = bindBean.getUnFlowTemplateMap();
            // 如果没有绑定授权信息，则抛出业务异常。
            if (CollectionUtils.isEmpty(bindAuth.values())) {
                throw new BusinessException("无应用绑定");
            }
            // 遍历绑定授权信息，设置内容的标题。
            for (FormBindAuthBean authBean : bindAuth.values()) {
                content.setTitle(authBean.getName());
            }
        }
        // 设置模块类型。
        content.setModuleType(getModuleTypeCap4(formBean));
        // 设置创建人ID和创建时间。
        content.setCreateId(userid);
        content.setCreateDate(timestamp);
        // 设置排序字段。
        content.setSort(0);
        // 设置内容的唯一ID。
        content.setId(UUIDLong.longUUID());
        // 设置内容的状态。
        content.setStatus(MainbodyStatus.STATUS_POST_SAVE);
        // 设置内容的类型。
        content.setContentType(Integer.valueOf(MainbodyType.FORM.getKey()));
        // 设置内容模板ID。
        content.setContentTemplateId(formBean.getId());
        // 设置内容数据ID。
        content.setContentDataId(masterId);
        // 设置模块ID。
        content.setModuleId(masterId);
        // 更新修改时间。
        content.setModifyDate(timestamp);
        // 更新修改人ID。
        content.setModifyId(userid);
        // 设置权限ID。
        content.setRightId(rightId);
        // 将内容bean转换为内容all对象并返回。
        return content.toContentAll();
    }


    /**
     * 根据表单类型获取模块类型常量值。
     * 此方法专门处理表单类型为6的情况，映射到相应的模块类型常量。
     * 如果表单类型不是6，则认为是无效的表单类型，抛出业务异常。
     *
     * @param formBean 表单bean对象，包含表单类型信息。
     * @return 返回模块类型常量的整型值。
     * @throws BusinessException 如果表单类型无效，则抛出业务异常。
     */
    private static int getModuleTypeCap4(FormBean formBean) throws BusinessException {
        /* 初始化模块类型为0，表示默认状态 */
        int moduleType = 0;
        /* 判断表单类型是否为6 */
        if (formBean.getFormType() == 6) {
            /* 如果是，則将模块类型设置为cap4UnflowForm对应的键值 */
            moduleType = ModuleType.cap4UnflowForm.getKey();
        }
        /* 如果模块类型仍然为0，说明表单类型不是6，视为无效表单类型 */
        if (moduleType == 0) {
            /* 记录日志警告无效的表单类型 */
            log.warn("无效表类型");
            /* 抛出业务异常，提示内容保存失败 */
            throw new BusinessException("内容保存失败");
        }
        /* 返回计算得到的模块类型 */
        return moduleType;
    }

    /**
     * 分析发票信息
     * 该方法用于从JSON数组中提取特定键对应的发票信息值
     *
     * @param words_result 包含发票信息的JSON数组
     * @param key          需要提取的发票信息的键
     * @return 提取到的发票信息值如果未找到则返回空字符串
     */
    private static String analysisInvoice(JSONArray words_result, String key) {
        String value = "";
        // 遍历JSON数组，寻找包含所需发票信息的项
        for (int i = 0; i < words_result.size(); i++) {
            JSONObject words_result_obj = words_result.getJSONObject(i);
            JSONObject result_obj = words_result_obj.getJSONObject("result");
            // 检查当前项是否包含所需的信息键
            if (result_obj.containsKey(key)) {
                JSONArray invoiceTypeOry = result_obj.getJSONArray(key);
                // 提取并赋值所需发票信息
                value = StrKit.str(invoiceTypeOry.getJSONObject(0).get("word"));
            }
        }
        // 返回提取到的发票信息值
        return value;
    }


}
